home *** CD-ROM | disk | FTP | other *** search
- /***********************************************
- mk_tkt.c Peter Tan
- used to create the "ticket file" in RAM.
- sets TKT_ENV env variable to point
- to the segment where the ticket file exists.
-
- ***********************************************/
-
- #include <conf.h>
- #include <stdio.h>
- #include <string.h>
- #include <dos.h>
- #include <stdlib.h>
- #include <krb.h>
-
- #define TKT_FIL_SZ 64U /* Number of paragraphs */
- #define TKT_FIL_MIN 16U /* Minimum number of paragraphs */
-
- extern char far *nxtevar (char far*vptr);
- extern char far *mstenvp (void);
- extern int envsiz (char far*envptr);
-
- char far *menv;
- char far *rest;
- char far *lstbyt;
- char vname[512], *txtptr;
- int free_env,nmlen;
- char *progname;
-
- void findvar(char *varnam)
- {
- nmlen=strlen(varnam);
- txtptr=NULL;
- while (*menv) {
- rest=nxtevar(menv);
- sprintf(vname,"%Fs",menv);
- if (vname[nmlen]=='=') { /* possible match */
- vname[nmlen]='\0';
- if (stricmp(vname,varnam)==0) {
- txtptr=&vname[nmlen+1];
- vname[nmlen]='=';
- return; /* found it, leave now */
- }
- }
- menv=rest; /* try again with next */
- }
- }
-
- void putenvbak()
- {
- char * locptr;
- int i,save_size;
-
- save_size=FP_OFF(lstbyt)-FP_OFF(rest) +1;
- locptr=(char*)malloc(save_size);
-
- for (i=0; i<save_size;i++) /* save trailing data */
- locptr[i]=rest[i];
- for (i=0; vname[i];i++) /* copy new env setting */
- *menv++=vname[i];
- if (vname[0]) /* if not deleting */
- *menv++='\0'; /* ... add end of string */
- for (i=0;i<save_size;i++)
- *menv++=locptr[i];
- free(locptr);
- }
-
- void setvar(char *varnam,char *value)
- {
- int i;
- menv=mstenvp();
- free_env=envsiz(menv);
- findvar(varnam);
- for (lstbyt=menv;*lstbyt;)
- lstbyt=nxtevar(lstbyt); /* find last byte */
- if (lstbyt[1]==1 && lstbyt[2]==0) {
- lstbyt+=3; /* skip loadfile name */
- while (*lstbyt)
- lstbyt++;
- }
- lstbyt++;
- free_env -= FP_OFF(lstbyt); /* what's left is free */
- if (txtptr==NULL) { /* Name not found */
- free_env-=nmlen+1; /* take out free space
- if (free_env < strlen(value)) {
- printf("%s : Not enough environment space",progname);
- exit(1);
- }
- /* add the environment variable */
- for (i=0;i<nmlen;i++) /* force uppercase */
- vname[i]=(char)toupper(varnam[i]);
- vname[nmlen]='=';
- vname[nmlen+1]='\0';
- txtptr=&vname[nmlen+1];
- }
- if (value)
- strcpy(txtptr,value);
- else
- vname[0]=0; /* delete this variable */
- putenvbak();
- }
-
- void remove_memory()
- {
- tkt_header far *hdr;
- char *value;
- unsigned segment;
-
- if ((value=getenv(TKT_ENV))==NULL) {
- printf("%s : Ticket memory not reserved\n",progname);
- exit(0);
- }
- sscanf(value,"%u",&segment);
- if (segment==0) {
- printf("%s : Environment variable corrupt\n",progname);
- exit(0);
- }
- setvar(TKT_ENV,NULL);
- hdr=(char far *)((unsigned long)segment<<16|0UL);
- #ifdef __BORLANDC__
- freemem(segment);
- #else
- _dos_freemem(segment);
- #endif
- printf("%s : Ticket memory freed OK\n",progname);
- exit(0);
- }
-
- void clear_sema()
- {
- tkt_header far *hdr;
- char *value;
- unsigned segment;
-
- if ((value=getenv(TKT_ENV))==NULL) {
- printf("%s : Ticket memory not reserved\n",progname);
- exit(0);
- }
- sscanf(value,"%u",&segment);
- if (segment==0) {
- printf("%s : Environment variable corrupt\n",progname);
- exit(0);
- }
- hdr=(char far *)((unsigned long)segment<<16|0UL);
- hdr->sema=0;
- printf("%s : Ticket file semaphore reset\n",progname);
- exit(0);
- }
-
- main(int argc,char **argv)
- {
- tkt_header far *hdr;
- char value[12];
- unsigned buffer_size;
-
- progname=argv[0];
-
- if (strchr(argv[1],'?')) {
- printf("Usage : kerbmem [-u] [nnn]\n"
- "-u : Uinstall memory\n"
- "-c : Clear reference count/semaphore\n"
- "nnn : Number of paragraphs to reserve.\n");
- exit(1);
- }
-
- if (!strcmp(argv[1],"-u"))
- remove_memory();
-
- if (!strcmp(argv[1],"-c"))
- clear_sema();
-
- if ((buffer_size=atoi(argv[1]))<TKT_FIL_MIN)
- buffer_size=TKT_FIL_SZ;
-
- if (getenv(TKT_ENV)) {
- printf("%s : Kerberos ticket memory already installed\n",progname);
- exit(0);
- }
- sprintf(value,"%u",(unsigned)_psp);
- setvar(TKT_ENV,value);
-
- hdr=(char far *)((unsigned long)_psp<<16|0UL);
- hdr->buf_size=buffer_size*16; /* size of segment */
- hdr->eof_ptr=sizeof(tkt_header); /* pointer to EOF */
- hdr->sema=0; /* start with unlocked file */
- printf("%s : Kerberos ticket memory \n"
- "%d paragraphs installed OK\n",progname,buffer_size);
- /* free environment */
- #ifdef __BORLANDC__
- freemem(*(unsigned far *)((char far *)hdr+0x2c));
- keep(0,buffer_size);
- #else
- _dos_freemem(*(unsigned far *)((char far *)hdr+0x2c));
- _dos_keep(0,buffer_size);
- #endif
- }
-
-